@camstack/system 1.2.444 → 1.2.445
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-runner.js +40 -31
- package/dist/addon-runner.mjs +41 -32
- package/dist/{agent-https-DlpTMDqA.js → agent-https-CiOW0-sj.js} +810 -12
- package/dist/{agent-https-U0d4uvn2.mjs → agent-https-D4Q8iFNd.mjs} +697 -13
- package/dist/auth/admin-token-manager.d.ts +9 -3
- package/dist/auth/api-key-manager.d.ts +9 -3
- package/dist/auth/auth-audit-log.d.ts +9 -3
- package/dist/auth/device-credential-manager.d.ts +5 -1
- package/dist/auth/external-identity-manager.d.ts +8 -21
- package/dist/auth/login-session-manager.d.ts +11 -3
- package/dist/auth/scoped-token-manager.d.ts +8 -52
- package/dist/auth/totp-manager.d.ts +11 -3
- package/dist/auth/user-manager.d.ts +10 -17
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
- package/dist/builtins/alerts/alert-store.d.ts +32 -0
- package/dist/builtins/alerts/alerts.addon.d.ts +9 -2
- package/dist/builtins/alerts/alerts.addon.js +289 -150
- package/dist/builtins/alerts/alerts.addon.mjs +288 -150
- package/dist/builtins/alerts/record-kinds.d.ts +15 -0
- package/dist/builtins/autotrack/index.js +1 -1
- package/dist/builtins/autotrack/index.mjs +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +1 -0
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +134 -193
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +134 -193
- package/dist/builtins/backup-orchestrator/destination-policy.d.ts +4 -2
- package/dist/builtins/backup-orchestrator/encryption-key-store.d.ts +4 -2
- package/dist/builtins/backup-orchestrator/record-kinds.d.ts +58 -0
- package/dist/builtins/backup-orchestrator/schedule-store.d.ts +4 -2
- package/dist/builtins/backup-orchestrator/seed-marker-store.d.ts +4 -2
- package/dist/builtins/calendars/calendar-prefs-store.d.ts +13 -5
- package/dist/builtins/calendars/calendars.addon.d.ts +2 -2
- package/dist/builtins/calendars/calendars.addon.js +67 -64
- package/dist/builtins/calendars/calendars.addon.mjs +59 -64
- package/dist/builtins/calendars/record-kinds.d.ts +18 -0
- package/dist/builtins/camera-grid/index.js +1 -1
- package/dist/builtins/camera-grid/index.mjs +1 -1
- package/dist/builtins/cluster-agent/record-kinds.d.ts +36 -0
- package/dist/builtins/composer/composer.addon.js +2 -2
- package/dist/builtins/composer/composer.addon.mjs +2 -2
- package/dist/builtins/console-logging/index.js +1 -1
- package/dist/builtins/console-logging/index.mjs +1 -1
- package/dist/builtins/core-blocks/block-settings-store.d.ts +8 -4
- package/dist/builtins/core-blocks/core-block-store.d.ts +8 -16
- package/dist/builtins/core-blocks/core-blocks.addon.js +85 -112
- package/dist/builtins/core-blocks/core-blocks.addon.mjs +86 -113
- package/dist/builtins/core-blocks/index.mjs +1 -1
- package/dist/builtins/core-blocks/record-kinds.d.ts +26 -0
- package/dist/builtins/device-manager/device-manager.addon.js +111 -187
- package/dist/builtins/device-manager/device-manager.addon.mjs +110 -187
- package/dist/builtins/device-manager/device-tombstone-store.d.ts +9 -48
- package/dist/builtins/device-manager/record-kinds.d.ts +14 -0
- package/dist/builtins/hub-forwarder/index.js +1 -1
- package/dist/builtins/hub-forwarder/index.mjs +1 -1
- package/dist/builtins/keychain/index.js +152 -22
- package/dist/builtins/keychain/index.mjs +152 -22
- package/dist/builtins/keychain/keychain-service.d.ts +3 -2
- package/dist/builtins/keychain/keychain-store.d.ts +13 -2
- package/dist/builtins/keychain/record-kinds.d.ts +16 -0
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
- package/dist/builtins/local-auth/auth-schema.d.ts +3 -1
- package/dist/builtins/local-auth/local-auth.addon.js +2903 -2123
- package/dist/builtins/local-auth/local-auth.addon.mjs +2904 -2124
- package/dist/builtins/local-auth/oauth-session-manager.d.ts +8 -48
- package/dist/builtins/local-auth/record-kinds.d.ts +141 -0
- package/dist/builtins/local-network/local-network.addon.js +2 -2
- package/dist/builtins/local-network/local-network.addon.mjs +2 -2
- package/dist/builtins/loki-logging/index.js +1 -1
- package/dist/builtins/loki-logging/index.mjs +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
- package/dist/builtins/platform-probe/index.js +1 -1
- package/dist/builtins/platform-probe/index.mjs +1 -1
- package/dist/builtins/record-entries/index.js +1 -1
- package/dist/builtins/record-entries/index.mjs +1 -1
- package/dist/builtins/records/legacy-table-row-count.d.ts +5 -0
- package/dist/builtins/records/phase6-declare-gate.d.ts +28 -0
- package/dist/builtins/records-isolated.d.ts +10 -0
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
- package/dist/builtins/snapshot/index.js +1 -1
- package/dist/builtins/snapshot/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
- package/dist/builtins/sqlite-storage/index.js +1 -1
- package/dist/builtins/sqlite-storage/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/integration-record-kinds.d.ts +30 -0
- package/dist/builtins/sqlite-storage/integration-registry.d.ts +10 -16
- package/dist/builtins/sqlite-storage/records/count-settings-array-legacy.d.ts +5 -0
- package/dist/builtins/sqlite-storage/records/count-settings-brokers-legacy.d.ts +6 -0
- package/dist/builtins/sqlite-storage/records/records-engine-types.d.ts +5 -0
- package/dist/builtins/sqlite-storage/records/records-engine.d.ts +4 -0
- package/dist/builtins/sqlite-storage/records/records-provider.d.ts +5 -1
- package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +17 -0
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +111 -3
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +111 -3
- package/dist/builtins/sqlite-storage/storage-admin-provider.d.ts +9 -1
- package/dist/builtins/storage-orchestrator/drain-state-store.d.ts +5 -2
- package/dist/builtins/storage-orchestrator/location-store.d.ts +7 -2
- package/dist/builtins/storage-orchestrator/record-kinds.d.ts +38 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +2 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +196 -5
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +195 -6
- package/dist/builtins/system-config/record-kinds.d.ts +32 -0
- package/dist/builtins/system-config/system-config.addon.js +53 -618
- package/dist/builtins/system-config/system-config.addon.mjs +29 -577
- package/dist/builtins/winston-logging/index.js +1 -1
- package/dist/builtins/winston-logging/index.mjs +1 -1
- package/dist/{composition-sources-C3rKncIF.mjs → composition-sources-BMt5cFYb.mjs} +1 -1
- package/dist/{composition-sources-NAPZddic.js → composition-sources-D3fi9Xns.js} +1 -1
- package/dist/{constants-BKX2QnIg.mjs → constants-BMHCxRzb.mjs} +1 -1
- package/dist/{constants-BXiNEIeV.js → constants-Br879Axi.js} +1 -1
- package/dist/{device-ca-DT9X2S6d.js → device-ca-CnJ_va7i.js} +1 -1
- package/dist/{device-ca-jxjSL8Ov.mjs → device-ca-T8osSMos.mjs} +1 -1
- package/dist/{dist-DERK-gP5.mjs → dist-BNunRyXT.mjs} +174 -58
- package/dist/{dist-D1vECb_6.js → dist-DgOG8flk.js} +233 -57
- package/dist/file-host-worker.js +1 -1
- package/dist/file-host-worker.mjs +1 -1
- package/dist/{hub-mdns-ciao-Cah9GCIg.js → hub-mdns-ciao-BIkTHq-n.js} +2 -2
- package/dist/{hub-mdns-ciao-CRaC97V0.mjs → hub-mdns-ciao-D16oRQ9K.mjs} +2 -2
- package/dist/index.d.ts +7 -0
- package/dist/index.js +3093 -2820
- package/dist/index.mjs +3065 -2809
- package/dist/kernel/index.d.ts +2 -0
- package/dist/kernel/moleculer/event-bus.d.ts +3 -1
- package/dist/kernel/moleculer/mesh-mtls/mesh-certificate-registry.d.ts +5 -1
- package/dist/kernel/moleculer/remote-logger.d.ts +2 -2
- package/dist/kernel/transport/cap-route-resolver.d.ts +9 -38
- package/dist/phase6-declare-gate-Ci1-8uUn.js +98 -0
- package/dist/phase6-declare-gate-tkKOEitw.mjs +93 -0
- package/dist/read-all-rows-CVoO1ONM.js +29 -0
- package/dist/read-all-rows-TaPqdWNF.mjs +25 -0
- package/dist/records/read-all-rows.d.ts +6 -0
- package/dist/{restore-archive-daKyE24F.mjs → restore-archive-DR9MtO7J.mjs} +339 -9
- package/dist/{restore-archive-Dy-qKTdF.js → restore-archive-DjJnCgap.js} +353 -5
- package/dist/tls/agent-https-names.d.ts +9 -13
- package/dist/{wal-maintenance-dAv4IdzC.js → wal-maintenance-CODGqhKY.js} +0 -0
- package/dist/{wal-maintenance-zRc24mOC.mjs → wal-maintenance-CfvgtQ7C.mjs} +0 -0
- package/package.json +1 -1
package/dist/addon-runner.js
CHANGED
|
@@ -2895,9 +2895,10 @@ var PeerAnsweredError = class extends Error {
|
|
|
2895
2895
|
* keychain owner-checks on this field, and until 2026-10-08 an unstamped
|
|
2896
2896
|
* call let a child's own `callerAddonId` through untouched.
|
|
2897
2897
|
*
|
|
2898
|
-
*
|
|
2899
|
-
*
|
|
2900
|
-
*
|
|
2898
|
+
* Hub-main in-process contexts that bypass tRPC (addon-registry's stated
|
|
2899
|
+
* transports) never reach this function. Co-located broker/agent callers
|
|
2900
|
+
* stamp here inside `localProviderLink` before the zero-copy invoke.
|
|
2901
|
+
* A non-object `args` (or `null`/array) is returned unchanged: there
|
|
2901
2902
|
* is nowhere to attach a key, and nowhere one could hide.
|
|
2902
2903
|
*/
|
|
2903
2904
|
function stampCallerAddonId(args, callerAddonId) {
|
|
@@ -5690,6 +5691,9 @@ function getWorkerNativeCapProvider(capName, deviceId) {
|
|
|
5690
5691
|
if (typeof raw !== "object" || Array.isArray(raw)) return void 0;
|
|
5691
5692
|
return raw;
|
|
5692
5693
|
}
|
|
5694
|
+
function deviceHasStreamSources(device) {
|
|
5695
|
+
return typeof Reflect.get(device, "getStreamSources") === "function";
|
|
5696
|
+
}
|
|
5693
5697
|
function buildDeviceOpsProvider(device) {
|
|
5694
5698
|
const assertMatch = (incoming) => {
|
|
5695
5699
|
if (incoming !== device.id) throw new Error(`device-ops: deviceId mismatch — expected '${device.id}', got '${incoming}'`);
|
|
@@ -5697,9 +5701,8 @@ function buildDeviceOpsProvider(device) {
|
|
|
5697
5701
|
return {
|
|
5698
5702
|
getStreamSources: async (input) => {
|
|
5699
5703
|
assertMatch(input.deviceId);
|
|
5700
|
-
|
|
5701
|
-
|
|
5702
|
-
return [...await maybeCamera.getStreamSources()];
|
|
5704
|
+
if (!deviceHasStreamSources(device)) return [];
|
|
5705
|
+
return [...await device.getStreamSources()];
|
|
5703
5706
|
},
|
|
5704
5707
|
getConfigEntries: async (input) => {
|
|
5705
5708
|
assertMatch(input.deviceId);
|
|
@@ -5749,7 +5752,7 @@ function createBrokerDeviceManagerApi(opts) {
|
|
|
5749
5752
|
const { api, addonId, nodeId, eventBus, registry } = opts;
|
|
5750
5753
|
const deviceSliceSource = (0, _camstack_types_addon.createEventBusSliceSource)({
|
|
5751
5754
|
eventBus,
|
|
5752
|
-
api
|
|
5755
|
+
api: (0, _camstack_types_addon.addonSliceHandleApi)(api)
|
|
5753
5756
|
});
|
|
5754
5757
|
let selfApi;
|
|
5755
5758
|
const childrenLoader = createChildrenBatchLoader({
|
|
@@ -5837,15 +5840,14 @@ function createBrokerDeviceManagerApi(opts) {
|
|
|
5837
5840
|
}
|
|
5838
5841
|
const finalProvider = (() => {
|
|
5839
5842
|
if (!cap.status || !cap.runtimeState || !runtimeStateRef) return provider;
|
|
5840
|
-
|
|
5841
|
-
if (typeof asRecord["getStatus"] === "function") return provider;
|
|
5843
|
+
if (typeof Reflect.get(provider, "getStatus") === "function") return provider;
|
|
5842
5844
|
const rsRef = runtimeStateRef;
|
|
5843
5845
|
const defaultGetStatus = async ({ deviceId: dId }) => {
|
|
5844
5846
|
if (typeof dId === "number" && dId !== id) return null;
|
|
5845
5847
|
return rsRef.getCapState(cap.name) ?? null;
|
|
5846
5848
|
};
|
|
5847
5849
|
return {
|
|
5848
|
-
...
|
|
5850
|
+
...provider,
|
|
5849
5851
|
getStatus: defaultGetStatus
|
|
5850
5852
|
};
|
|
5851
5853
|
})();
|
|
@@ -7403,8 +7405,9 @@ function localProviderLink(resolver, observerOpts) {
|
|
|
7403
7405
|
const fn = Reflect.get(provider, parsed.method);
|
|
7404
7406
|
if (typeof fn !== "function") return next(opWithDefaults);
|
|
7405
7407
|
if (observerOpts) recordCapUsage(observerOpts, parsed.capName, parsed.method);
|
|
7408
|
+
const localInput = _camstack_types_addon.CALLER_STAMPED_CAPABILITIES.includes(parsed.capName) ? stampCallerAddonId(opWithDefaults.input, observerOpts?.callerAddonId) : opWithDefaults.input;
|
|
7406
7409
|
return observable((observer) => {
|
|
7407
|
-
Promise.resolve(fn.call(provider,
|
|
7410
|
+
Promise.resolve(fn.call(provider, localInput)).then((data) => {
|
|
7408
7411
|
observer.next({ result: {
|
|
7409
7412
|
type: "data",
|
|
7410
7413
|
data
|
|
@@ -7421,7 +7424,7 @@ function localProviderLink(resolver, observerOpts) {
|
|
|
7421
7424
|
function findServiceCandidates(broker, capName, method, forceServiceName) {
|
|
7422
7425
|
const actionSuffix = capActionSuffix(capName, method);
|
|
7423
7426
|
const bareAction = capBareAction(capName, method);
|
|
7424
|
-
const services = broker
|
|
7427
|
+
const services = Reflect.get(broker, "registry")?.getServiceList?.({
|
|
7425
7428
|
onlyAvailable: true,
|
|
7426
7429
|
withActions: true
|
|
7427
7430
|
}) ?? [];
|
|
@@ -8455,7 +8458,11 @@ function createAddonPeerBytesFacility(args) {
|
|
|
8455
8458
|
res.destroy();
|
|
8456
8459
|
}, Math.max(1e3, Math.floor(stallMs / 4)));
|
|
8457
8460
|
stallTimer.unref();
|
|
8458
|
-
const ended = await Promise.race([(0, node_events.once)(stream, "end").then(() => true),
|
|
8461
|
+
const ended = await Promise.race([(0, node_events.once)(stream, "end").then(() => true), new Promise((resolve) => {
|
|
8462
|
+
res.once("close", () => {
|
|
8463
|
+
resolve(false);
|
|
8464
|
+
});
|
|
8465
|
+
})]).catch(() => false);
|
|
8459
8466
|
clearInterval(stallTimer);
|
|
8460
8467
|
if (ended) {
|
|
8461
8468
|
args.logger.info("peer-bytes: body sent", {
|
|
@@ -8765,6 +8772,10 @@ var AddonDepsManager = class {
|
|
|
8765
8772
|
};
|
|
8766
8773
|
//#endregion
|
|
8767
8774
|
//#region src/kernel/moleculer/event-bus.ts
|
|
8775
|
+
/** Documented boundary: CamStack brokers are always `createBroker` products. */
|
|
8776
|
+
function asBrokerLike(broker) {
|
|
8777
|
+
return broker;
|
|
8778
|
+
}
|
|
8768
8779
|
/**
|
|
8769
8780
|
* Topic prefix for clustered EventBus broadcasts. The `camstack.evt.`
|
|
8770
8781
|
* namespace keeps our events disjoint from Moleculer internal events
|
|
@@ -8937,14 +8948,13 @@ function acceptInboundCrossNode(broker, category) {
|
|
|
8937
8948
|
function registerEventBusService(broker) {
|
|
8938
8949
|
if (eventBusServiceInstalled.has(broker)) return;
|
|
8939
8950
|
eventBusServiceInstalled.add(broker);
|
|
8940
|
-
const bkr = broker;
|
|
8941
8951
|
try {
|
|
8942
|
-
|
|
8952
|
+
broker.createService({
|
|
8943
8953
|
name: "$event-bus",
|
|
8944
8954
|
events: { [EVENT_TOPIC_WILDCARD](ctx) {
|
|
8945
8955
|
const event = ctx.params;
|
|
8946
8956
|
if (!event) return;
|
|
8947
|
-
if (event.sourceNodeId ===
|
|
8957
|
+
if (event.sourceNodeId === broker.nodeID) return;
|
|
8948
8958
|
if (!acceptInboundCrossNode(broker, event.category)) return;
|
|
8949
8959
|
deliverShared(getSharedBusState(broker), event);
|
|
8950
8960
|
} }
|
|
@@ -8952,7 +8962,7 @@ function registerEventBusService(broker) {
|
|
|
8952
8962
|
} catch (err) {
|
|
8953
8963
|
const msg = err instanceof Error ? err.message : String(err);
|
|
8954
8964
|
try {
|
|
8955
|
-
|
|
8965
|
+
broker.logger?.warn?.(`[event-bus] failed to register $event-bus service: ${msg}`);
|
|
8956
8966
|
} catch {}
|
|
8957
8967
|
}
|
|
8958
8968
|
}
|
|
@@ -8964,7 +8974,6 @@ function registerEventBusService(broker) {
|
|
|
8964
8974
|
* nothing and `getRecent` returns `[]`. Events are one-shot everywhere else.
|
|
8965
8975
|
*/
|
|
8966
8976
|
function getBrokerEventBus(broker, options) {
|
|
8967
|
-
const bkr = broker;
|
|
8968
8977
|
const state = getSharedBusState(broker, options?.retainRecent ?? false);
|
|
8969
8978
|
registerEventBusService(broker);
|
|
8970
8979
|
const warnTimestamps = (() => {
|
|
@@ -8979,19 +8988,19 @@ function getBrokerEventBus(broker, options) {
|
|
|
8979
8988
|
emit(event) {
|
|
8980
8989
|
const enriched = {
|
|
8981
8990
|
...event,
|
|
8982
|
-
sourceNodeId:
|
|
8991
|
+
sourceNodeId: broker.nodeID
|
|
8983
8992
|
};
|
|
8984
8993
|
deliverShared(state, enriched);
|
|
8985
8994
|
const topic = clusterEventTopic(event.category);
|
|
8986
8995
|
try {
|
|
8987
|
-
|
|
8996
|
+
broker.broadcast(topic, enriched);
|
|
8988
8997
|
} catch (err) {
|
|
8989
8998
|
const cat = event.category;
|
|
8990
8999
|
const now = Date.now();
|
|
8991
9000
|
if (now - (warnTimestamps.get(`broadcast:${cat}`) ?? 0) > 6e4) {
|
|
8992
9001
|
warnTimestamps.set(`broadcast:${cat}`, now);
|
|
8993
9002
|
try {
|
|
8994
|
-
|
|
9003
|
+
broker.logger?.warn?.(`[event-bus] broker.broadcast('${topic}') failed for category="${cat}" nodeID="${broker.nodeID}": ${err instanceof Error ? err.message : String(err)}`);
|
|
8995
9004
|
} catch {}
|
|
8996
9005
|
}
|
|
8997
9006
|
}
|
|
@@ -9141,7 +9150,7 @@ function setPreferredProvider(capabilityName, addonId, brokerNodeId = "hub") {
|
|
|
9141
9150
|
*/
|
|
9142
9151
|
var bindingSubscriberInstalled = /* @__PURE__ */ new Set();
|
|
9143
9152
|
function ensureBindingSubscription(broker) {
|
|
9144
|
-
const bkr = broker;
|
|
9153
|
+
const bkr = asBrokerLike(broker);
|
|
9145
9154
|
if (bindingSubscriberInstalled.has(bkr.nodeID)) return;
|
|
9146
9155
|
bindingSubscriberInstalled.add(bkr.nodeID);
|
|
9147
9156
|
const handler = (payload) => {
|
|
@@ -9201,7 +9210,7 @@ var READINESS_RECONCILE_INTERVAL_MS = 6e4;
|
|
|
9201
9210
|
* entries already observed locally.
|
|
9202
9211
|
*/
|
|
9203
9212
|
function getOrInitReadinessRegistry(broker, eventBus, logger) {
|
|
9204
|
-
const bkr = broker;
|
|
9213
|
+
const bkr = asBrokerLike(broker);
|
|
9205
9214
|
const existing = brokerReadinessRegistries.get(broker);
|
|
9206
9215
|
if (existing) return existing;
|
|
9207
9216
|
const registry = new _camstack_types_addon.ReadinessRegistry({
|
|
@@ -9329,8 +9338,8 @@ function getOrInitReadinessRegistryForClient(client, eventBus, logger, nodeId) {
|
|
|
9329
9338
|
function buildCapabilitiesAccess(broker, localRegs) {
|
|
9330
9339
|
const collectRemoteEntries = (capName) => {
|
|
9331
9340
|
if (broker === void 0) return [];
|
|
9332
|
-
const bkr = broker;
|
|
9333
|
-
const rawRegistry = Reflect.get(
|
|
9341
|
+
const bkr = asBrokerLike(broker);
|
|
9342
|
+
const rawRegistry = Reflect.get(broker, "registry");
|
|
9334
9343
|
if (rawRegistry === null || typeof rawRegistry !== "object" || !("getServiceList" in rawRegistry)) return [];
|
|
9335
9344
|
const services = rawRegistry.getServiceList({
|
|
9336
9345
|
onlyAvailable: true,
|
|
@@ -9413,7 +9422,7 @@ function buildCapabilitiesAccess(broker, localRegs) {
|
|
|
9413
9422
|
* consumers (e.g. `await maybeProxy` mustn't hang).
|
|
9414
9423
|
*/
|
|
9415
9424
|
function createRemoteProviderProxy(broker, serviceName, capName, nodeId, methods) {
|
|
9416
|
-
const bkr = broker;
|
|
9425
|
+
const bkr = asBrokerLike(broker);
|
|
9417
9426
|
const dispatcher = Object.create(null);
|
|
9418
9427
|
for (const method of methods) dispatcher[method] = (input) => {
|
|
9419
9428
|
return bkr.call(`${serviceName}.${capName}.${method}`, serializeTypedArrays(input), {
|
|
@@ -10152,7 +10161,7 @@ function createRunnerDeviceSettings(client, addonId, before = async () => {}) {
|
|
|
10152
10161
|
//#region src/kernel/moleculer/addon-context-factory.ts
|
|
10153
10162
|
/** This runtime's node id, regardless of mode (broker.nodeID or the UDS child nodeId). */
|
|
10154
10163
|
function runtimeNodeId(runtime) {
|
|
10155
|
-
return runtime.mode === "broker" ? runtime.broker.nodeID : runtime.nodeId;
|
|
10164
|
+
return runtime.mode === "broker" ? asBrokerLike(runtime.broker).nodeID : runtime.nodeId;
|
|
10156
10165
|
}
|
|
10157
10166
|
/**
|
|
10158
10167
|
* Adapt a Moleculer ServiceBroker to the camstack-types `IClusterBroker`
|
|
@@ -10162,7 +10171,7 @@ function runtimeNodeId(runtime) {
|
|
|
10162
10171
|
* forward through a thin object instead of casting at the boundary.
|
|
10163
10172
|
*/
|
|
10164
10173
|
function adaptBrokerToCluster(broker) {
|
|
10165
|
-
const bkr = broker;
|
|
10174
|
+
const bkr = asBrokerLike(broker);
|
|
10166
10175
|
return {
|
|
10167
10176
|
get nodeID() {
|
|
10168
10177
|
return bkr.nodeID;
|
|
@@ -10306,7 +10315,7 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
|
|
|
10306
10315
|
const scopedEventBus = runtime.mode === "broker" ? createBrokerEventBus(runtime.broker, addonId) : createUdsEventBus(runtime.client, addonId);
|
|
10307
10316
|
const deviceSliceSource = (0, _camstack_types_addon.createEventBusSliceSource)({
|
|
10308
10317
|
eventBus: scopedEventBus,
|
|
10309
|
-
api
|
|
10318
|
+
api: (0, _camstack_types_addon.addonSliceHandleApi)(api)
|
|
10310
10319
|
});
|
|
10311
10320
|
const workerDisposerChain = new _camstack_types_addon.DisposerChain({ onError: (err, index) => {
|
|
10312
10321
|
scopedLogger.error(`Disposer #${index} threw during teardown`, { meta: { error: err instanceof Error ? err.message : String(err) } });
|
|
@@ -10499,11 +10508,11 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
|
|
|
10499
10508
|
}),
|
|
10500
10509
|
kernel: (() => {
|
|
10501
10510
|
const streamProbe = runtime.mode === "broker" ? {
|
|
10502
|
-
probe: (url, probeOptions) => runtime.broker.call("$stream-probe.probe", {
|
|
10511
|
+
probe: (url, probeOptions) => asBrokerLike(runtime.broker).call("$stream-probe.probe", {
|
|
10503
10512
|
url,
|
|
10504
10513
|
force: probeOptions?.force ?? false
|
|
10505
10514
|
}),
|
|
10506
|
-
probeField: (key, value) => runtime.broker.call("$stream-probe.probeField", {
|
|
10515
|
+
probeField: (key, value) => asBrokerLike(runtime.broker).call("$stream-probe.probeField", {
|
|
10507
10516
|
key,
|
|
10508
10517
|
value
|
|
10509
10518
|
})
|
package/dist/addon-runner.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import * as fs from "node:fs";
|
|
|
3
3
|
import { createReadStream, createWriteStream, existsSync, readFileSync, readdirSync } from "node:fs";
|
|
4
4
|
import * as path from "node:path";
|
|
5
5
|
import { dirname, isAbsolute, join } from "node:path";
|
|
6
|
-
import { BOOT_RECOVERY_BACKOFF_MS, DATAPLANE_SECRET_HEADER, DEVICE_CHILDREN_BATCH_MAX, DeviceType, DisposerChain, ErrorI18nPayloadSchema, EventCategory, PEER_BYTES_CHUNK_BYTES, PEER_BYTES_MAX_OUTSTANDING, PEER_BYTES_STALL_MS, PEER_BYTES_TICKET_TTL_MS, ReadinessRegistry, ReadinessTimeoutError, asJsonObject, asString, collectZodSecretPaths, createDeviceProxy, createEventBusSliceSource, createRecordsAccess, createSecretsAccess, describeCustomActions, deviceOpsCapability, emitReadiness, errMsg, expandCapMethods, isCollectionArrayMethodName, isProviderOptionalMethodName, maskUrlCredentials, normalizeAddonInitResult, readErrorI18n, readNodePin, resolveSecretViewsIn, scopeKey, scrubKnownSecrets, withCapInputDefaults } from "@camstack/types/addon";
|
|
6
|
+
import { BOOT_RECOVERY_BACKOFF_MS, CALLER_STAMPED_CAPABILITIES, DATAPLANE_SECRET_HEADER, DEVICE_CHILDREN_BATCH_MAX, DeviceType, DisposerChain, ErrorI18nPayloadSchema, EventCategory, PEER_BYTES_CHUNK_BYTES, PEER_BYTES_MAX_OUTSTANDING, PEER_BYTES_STALL_MS, PEER_BYTES_TICKET_TTL_MS, ReadinessRegistry, ReadinessTimeoutError, addonSliceHandleApi, asJsonObject, asString, collectZodSecretPaths, createDeviceProxy, createEventBusSliceSource, createRecordsAccess, createSecretsAccess, describeCustomActions, deviceOpsCapability, emitReadiness, errMsg, expandCapMethods, isCollectionArrayMethodName, isProviderOptionalMethodName, maskUrlCredentials, normalizeAddonInitResult, readErrorI18n, readNodePin, resolveSecretViewsIn, scopeKey, scrubKnownSecrets, withCapInputDefaults } from "@camstack/types/addon";
|
|
7
7
|
import { execFile } from "node:child_process";
|
|
8
8
|
import { promisify } from "node:util";
|
|
9
9
|
import * as os from "node:os";
|
|
@@ -2871,9 +2871,10 @@ var PeerAnsweredError = class extends Error {
|
|
|
2871
2871
|
* keychain owner-checks on this field, and until 2026-10-08 an unstamped
|
|
2872
2872
|
* call let a child's own `callerAddonId` through untouched.
|
|
2873
2873
|
*
|
|
2874
|
-
*
|
|
2875
|
-
*
|
|
2876
|
-
*
|
|
2874
|
+
* Hub-main in-process contexts that bypass tRPC (addon-registry's stated
|
|
2875
|
+
* transports) never reach this function. Co-located broker/agent callers
|
|
2876
|
+
* stamp here inside `localProviderLink` before the zero-copy invoke.
|
|
2877
|
+
* A non-object `args` (or `null`/array) is returned unchanged: there
|
|
2877
2878
|
* is nowhere to attach a key, and nowhere one could hide.
|
|
2878
2879
|
*/
|
|
2879
2880
|
function stampCallerAddonId(args, callerAddonId) {
|
|
@@ -5666,6 +5667,9 @@ function getWorkerNativeCapProvider(capName, deviceId) {
|
|
|
5666
5667
|
if (typeof raw !== "object" || Array.isArray(raw)) return void 0;
|
|
5667
5668
|
return raw;
|
|
5668
5669
|
}
|
|
5670
|
+
function deviceHasStreamSources(device) {
|
|
5671
|
+
return typeof Reflect.get(device, "getStreamSources") === "function";
|
|
5672
|
+
}
|
|
5669
5673
|
function buildDeviceOpsProvider(device) {
|
|
5670
5674
|
const assertMatch = (incoming) => {
|
|
5671
5675
|
if (incoming !== device.id) throw new Error(`device-ops: deviceId mismatch — expected '${device.id}', got '${incoming}'`);
|
|
@@ -5673,9 +5677,8 @@ function buildDeviceOpsProvider(device) {
|
|
|
5673
5677
|
return {
|
|
5674
5678
|
getStreamSources: async (input) => {
|
|
5675
5679
|
assertMatch(input.deviceId);
|
|
5676
|
-
|
|
5677
|
-
|
|
5678
|
-
return [...await maybeCamera.getStreamSources()];
|
|
5680
|
+
if (!deviceHasStreamSources(device)) return [];
|
|
5681
|
+
return [...await device.getStreamSources()];
|
|
5679
5682
|
},
|
|
5680
5683
|
getConfigEntries: async (input) => {
|
|
5681
5684
|
assertMatch(input.deviceId);
|
|
@@ -5725,7 +5728,7 @@ function createBrokerDeviceManagerApi(opts) {
|
|
|
5725
5728
|
const { api, addonId, nodeId, eventBus, registry } = opts;
|
|
5726
5729
|
const deviceSliceSource = createEventBusSliceSource({
|
|
5727
5730
|
eventBus,
|
|
5728
|
-
api
|
|
5731
|
+
api: addonSliceHandleApi(api)
|
|
5729
5732
|
});
|
|
5730
5733
|
let selfApi;
|
|
5731
5734
|
const childrenLoader = createChildrenBatchLoader({
|
|
@@ -5813,15 +5816,14 @@ function createBrokerDeviceManagerApi(opts) {
|
|
|
5813
5816
|
}
|
|
5814
5817
|
const finalProvider = (() => {
|
|
5815
5818
|
if (!cap.status || !cap.runtimeState || !runtimeStateRef) return provider;
|
|
5816
|
-
|
|
5817
|
-
if (typeof asRecord["getStatus"] === "function") return provider;
|
|
5819
|
+
if (typeof Reflect.get(provider, "getStatus") === "function") return provider;
|
|
5818
5820
|
const rsRef = runtimeStateRef;
|
|
5819
5821
|
const defaultGetStatus = async ({ deviceId: dId }) => {
|
|
5820
5822
|
if (typeof dId === "number" && dId !== id) return null;
|
|
5821
5823
|
return rsRef.getCapState(cap.name) ?? null;
|
|
5822
5824
|
};
|
|
5823
5825
|
return {
|
|
5824
|
-
...
|
|
5826
|
+
...provider,
|
|
5825
5827
|
getStatus: defaultGetStatus
|
|
5826
5828
|
};
|
|
5827
5829
|
})();
|
|
@@ -7379,8 +7381,9 @@ function localProviderLink(resolver, observerOpts) {
|
|
|
7379
7381
|
const fn = Reflect.get(provider, parsed.method);
|
|
7380
7382
|
if (typeof fn !== "function") return next(opWithDefaults);
|
|
7381
7383
|
if (observerOpts) recordCapUsage(observerOpts, parsed.capName, parsed.method);
|
|
7384
|
+
const localInput = CALLER_STAMPED_CAPABILITIES.includes(parsed.capName) ? stampCallerAddonId(opWithDefaults.input, observerOpts?.callerAddonId) : opWithDefaults.input;
|
|
7382
7385
|
return observable((observer) => {
|
|
7383
|
-
Promise.resolve(fn.call(provider,
|
|
7386
|
+
Promise.resolve(fn.call(provider, localInput)).then((data) => {
|
|
7384
7387
|
observer.next({ result: {
|
|
7385
7388
|
type: "data",
|
|
7386
7389
|
data
|
|
@@ -7397,7 +7400,7 @@ function localProviderLink(resolver, observerOpts) {
|
|
|
7397
7400
|
function findServiceCandidates(broker, capName, method, forceServiceName) {
|
|
7398
7401
|
const actionSuffix = capActionSuffix(capName, method);
|
|
7399
7402
|
const bareAction = capBareAction(capName, method);
|
|
7400
|
-
const services = broker
|
|
7403
|
+
const services = Reflect.get(broker, "registry")?.getServiceList?.({
|
|
7401
7404
|
onlyAvailable: true,
|
|
7402
7405
|
withActions: true
|
|
7403
7406
|
}) ?? [];
|
|
@@ -8431,7 +8434,11 @@ function createAddonPeerBytesFacility(args) {
|
|
|
8431
8434
|
res.destroy();
|
|
8432
8435
|
}, Math.max(1e3, Math.floor(stallMs / 4)));
|
|
8433
8436
|
stallTimer.unref();
|
|
8434
|
-
const ended = await Promise.race([once(stream, "end").then(() => true),
|
|
8437
|
+
const ended = await Promise.race([once(stream, "end").then(() => true), new Promise((resolve) => {
|
|
8438
|
+
res.once("close", () => {
|
|
8439
|
+
resolve(false);
|
|
8440
|
+
});
|
|
8441
|
+
})]).catch(() => false);
|
|
8435
8442
|
clearInterval(stallTimer);
|
|
8436
8443
|
if (ended) {
|
|
8437
8444
|
args.logger.info("peer-bytes: body sent", {
|
|
@@ -8741,6 +8748,10 @@ var AddonDepsManager = class {
|
|
|
8741
8748
|
};
|
|
8742
8749
|
//#endregion
|
|
8743
8750
|
//#region src/kernel/moleculer/event-bus.ts
|
|
8751
|
+
/** Documented boundary: CamStack brokers are always `createBroker` products. */
|
|
8752
|
+
function asBrokerLike(broker) {
|
|
8753
|
+
return broker;
|
|
8754
|
+
}
|
|
8744
8755
|
/**
|
|
8745
8756
|
* Topic prefix for clustered EventBus broadcasts. The `camstack.evt.`
|
|
8746
8757
|
* namespace keeps our events disjoint from Moleculer internal events
|
|
@@ -8913,14 +8924,13 @@ function acceptInboundCrossNode(broker, category) {
|
|
|
8913
8924
|
function registerEventBusService(broker) {
|
|
8914
8925
|
if (eventBusServiceInstalled.has(broker)) return;
|
|
8915
8926
|
eventBusServiceInstalled.add(broker);
|
|
8916
|
-
const bkr = broker;
|
|
8917
8927
|
try {
|
|
8918
|
-
|
|
8928
|
+
broker.createService({
|
|
8919
8929
|
name: "$event-bus",
|
|
8920
8930
|
events: { [EVENT_TOPIC_WILDCARD](ctx) {
|
|
8921
8931
|
const event = ctx.params;
|
|
8922
8932
|
if (!event) return;
|
|
8923
|
-
if (event.sourceNodeId ===
|
|
8933
|
+
if (event.sourceNodeId === broker.nodeID) return;
|
|
8924
8934
|
if (!acceptInboundCrossNode(broker, event.category)) return;
|
|
8925
8935
|
deliverShared(getSharedBusState(broker), event);
|
|
8926
8936
|
} }
|
|
@@ -8928,7 +8938,7 @@ function registerEventBusService(broker) {
|
|
|
8928
8938
|
} catch (err) {
|
|
8929
8939
|
const msg = err instanceof Error ? err.message : String(err);
|
|
8930
8940
|
try {
|
|
8931
|
-
|
|
8941
|
+
broker.logger?.warn?.(`[event-bus] failed to register $event-bus service: ${msg}`);
|
|
8932
8942
|
} catch {}
|
|
8933
8943
|
}
|
|
8934
8944
|
}
|
|
@@ -8940,7 +8950,6 @@ function registerEventBusService(broker) {
|
|
|
8940
8950
|
* nothing and `getRecent` returns `[]`. Events are one-shot everywhere else.
|
|
8941
8951
|
*/
|
|
8942
8952
|
function getBrokerEventBus(broker, options) {
|
|
8943
|
-
const bkr = broker;
|
|
8944
8953
|
const state = getSharedBusState(broker, options?.retainRecent ?? false);
|
|
8945
8954
|
registerEventBusService(broker);
|
|
8946
8955
|
const warnTimestamps = (() => {
|
|
@@ -8955,19 +8964,19 @@ function getBrokerEventBus(broker, options) {
|
|
|
8955
8964
|
emit(event) {
|
|
8956
8965
|
const enriched = {
|
|
8957
8966
|
...event,
|
|
8958
|
-
sourceNodeId:
|
|
8967
|
+
sourceNodeId: broker.nodeID
|
|
8959
8968
|
};
|
|
8960
8969
|
deliverShared(state, enriched);
|
|
8961
8970
|
const topic = clusterEventTopic(event.category);
|
|
8962
8971
|
try {
|
|
8963
|
-
|
|
8972
|
+
broker.broadcast(topic, enriched);
|
|
8964
8973
|
} catch (err) {
|
|
8965
8974
|
const cat = event.category;
|
|
8966
8975
|
const now = Date.now();
|
|
8967
8976
|
if (now - (warnTimestamps.get(`broadcast:${cat}`) ?? 0) > 6e4) {
|
|
8968
8977
|
warnTimestamps.set(`broadcast:${cat}`, now);
|
|
8969
8978
|
try {
|
|
8970
|
-
|
|
8979
|
+
broker.logger?.warn?.(`[event-bus] broker.broadcast('${topic}') failed for category="${cat}" nodeID="${broker.nodeID}": ${err instanceof Error ? err.message : String(err)}`);
|
|
8971
8980
|
} catch {}
|
|
8972
8981
|
}
|
|
8973
8982
|
}
|
|
@@ -9117,7 +9126,7 @@ function setPreferredProvider(capabilityName, addonId, brokerNodeId = "hub") {
|
|
|
9117
9126
|
*/
|
|
9118
9127
|
var bindingSubscriberInstalled = /* @__PURE__ */ new Set();
|
|
9119
9128
|
function ensureBindingSubscription(broker) {
|
|
9120
|
-
const bkr = broker;
|
|
9129
|
+
const bkr = asBrokerLike(broker);
|
|
9121
9130
|
if (bindingSubscriberInstalled.has(bkr.nodeID)) return;
|
|
9122
9131
|
bindingSubscriberInstalled.add(bkr.nodeID);
|
|
9123
9132
|
const handler = (payload) => {
|
|
@@ -9177,7 +9186,7 @@ var READINESS_RECONCILE_INTERVAL_MS = 6e4;
|
|
|
9177
9186
|
* entries already observed locally.
|
|
9178
9187
|
*/
|
|
9179
9188
|
function getOrInitReadinessRegistry(broker, eventBus, logger) {
|
|
9180
|
-
const bkr = broker;
|
|
9189
|
+
const bkr = asBrokerLike(broker);
|
|
9181
9190
|
const existing = brokerReadinessRegistries.get(broker);
|
|
9182
9191
|
if (existing) return existing;
|
|
9183
9192
|
const registry = new ReadinessRegistry({
|
|
@@ -9305,8 +9314,8 @@ function getOrInitReadinessRegistryForClient(client, eventBus, logger, nodeId) {
|
|
|
9305
9314
|
function buildCapabilitiesAccess(broker, localRegs) {
|
|
9306
9315
|
const collectRemoteEntries = (capName) => {
|
|
9307
9316
|
if (broker === void 0) return [];
|
|
9308
|
-
const bkr = broker;
|
|
9309
|
-
const rawRegistry = Reflect.get(
|
|
9317
|
+
const bkr = asBrokerLike(broker);
|
|
9318
|
+
const rawRegistry = Reflect.get(broker, "registry");
|
|
9310
9319
|
if (rawRegistry === null || typeof rawRegistry !== "object" || !("getServiceList" in rawRegistry)) return [];
|
|
9311
9320
|
const services = rawRegistry.getServiceList({
|
|
9312
9321
|
onlyAvailable: true,
|
|
@@ -9389,7 +9398,7 @@ function buildCapabilitiesAccess(broker, localRegs) {
|
|
|
9389
9398
|
* consumers (e.g. `await maybeProxy` mustn't hang).
|
|
9390
9399
|
*/
|
|
9391
9400
|
function createRemoteProviderProxy(broker, serviceName, capName, nodeId, methods) {
|
|
9392
|
-
const bkr = broker;
|
|
9401
|
+
const bkr = asBrokerLike(broker);
|
|
9393
9402
|
const dispatcher = Object.create(null);
|
|
9394
9403
|
for (const method of methods) dispatcher[method] = (input) => {
|
|
9395
9404
|
return bkr.call(`${serviceName}.${capName}.${method}`, serializeTypedArrays(input), {
|
|
@@ -10128,7 +10137,7 @@ function createRunnerDeviceSettings(client, addonId, before = async () => {}) {
|
|
|
10128
10137
|
//#region src/kernel/moleculer/addon-context-factory.ts
|
|
10129
10138
|
/** This runtime's node id, regardless of mode (broker.nodeID or the UDS child nodeId). */
|
|
10130
10139
|
function runtimeNodeId(runtime) {
|
|
10131
|
-
return runtime.mode === "broker" ? runtime.broker.nodeID : runtime.nodeId;
|
|
10140
|
+
return runtime.mode === "broker" ? asBrokerLike(runtime.broker).nodeID : runtime.nodeId;
|
|
10132
10141
|
}
|
|
10133
10142
|
/**
|
|
10134
10143
|
* Adapt a Moleculer ServiceBroker to the camstack-types `IClusterBroker`
|
|
@@ -10138,7 +10147,7 @@ function runtimeNodeId(runtime) {
|
|
|
10138
10147
|
* forward through a thin object instead of casting at the boundary.
|
|
10139
10148
|
*/
|
|
10140
10149
|
function adaptBrokerToCluster(broker) {
|
|
10141
|
-
const bkr = broker;
|
|
10150
|
+
const bkr = asBrokerLike(broker);
|
|
10142
10151
|
return {
|
|
10143
10152
|
get nodeID() {
|
|
10144
10153
|
return bkr.nodeID;
|
|
@@ -10282,7 +10291,7 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
|
|
|
10282
10291
|
const scopedEventBus = runtime.mode === "broker" ? createBrokerEventBus(runtime.broker, addonId) : createUdsEventBus(runtime.client, addonId);
|
|
10283
10292
|
const deviceSliceSource = createEventBusSliceSource({
|
|
10284
10293
|
eventBus: scopedEventBus,
|
|
10285
|
-
api
|
|
10294
|
+
api: addonSliceHandleApi(api)
|
|
10286
10295
|
});
|
|
10287
10296
|
const workerDisposerChain = new DisposerChain({ onError: (err, index) => {
|
|
10288
10297
|
scopedLogger.error(`Disposer #${index} threw during teardown`, { meta: { error: err instanceof Error ? err.message : String(err) } });
|
|
@@ -10475,11 +10484,11 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
|
|
|
10475
10484
|
}),
|
|
10476
10485
|
kernel: (() => {
|
|
10477
10486
|
const streamProbe = runtime.mode === "broker" ? {
|
|
10478
|
-
probe: (url, probeOptions) => runtime.broker.call("$stream-probe.probe", {
|
|
10487
|
+
probe: (url, probeOptions) => asBrokerLike(runtime.broker).call("$stream-probe.probe", {
|
|
10479
10488
|
url,
|
|
10480
10489
|
force: probeOptions?.force ?? false
|
|
10481
10490
|
}),
|
|
10482
|
-
probeField: (key, value) => runtime.broker.call("$stream-probe.probeField", {
|
|
10491
|
+
probeField: (key, value) => asBrokerLike(runtime.broker).call("$stream-probe.probeField", {
|
|
10483
10492
|
key,
|
|
10484
10493
|
value
|
|
10485
10494
|
})
|