Alex2Node/dist/cjs/topics.js
David e0fe9d2812 bridge: subscribe to discover and +/alexaDirective only
The bridge subscribed to <root>/#, so the broker sent back every discover_r, alexaResponce and changeReport
the bridge published, and the backend's <endpointId>/alexaDirective_e. It now subscribes to <root>/discover
and <root>/+/alexaDirective, both named in src/topics.ts; a directive topic is recognised by the root and the
last segment instead of by counting three segments.
The test reads the subscriptions from the broker, publishes seven other topics under the root and one
directive for each of two endpoints: the bridge receives the two directives and the discovery request,
nothing else. Tests: 148 -> 150 (the count in the body of 6789a1a, 108 -> 113, should read 143 -> 148).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-28 19:36:09 +00:00

35 lines
2.1 KiB
JavaScript

"use strict";
// The topics of the Alex2MQTT contract, named once. The backend and Alex2ESP use the same names, so none of them
// can change here alone.
Object.defineProperty(exports, "__esModule", { value: true });
exports.changeReport = exports.deferred = exports.response = exports.subscriptions = exports.directive = exports.discoverReply = exports.discover = void 0;
exports.directiveEndpoint = directiveEndpoint;
/** Where the backend asks for the endpoints of the root. */
const discover = (root) => `${root}/discover`;
exports.discover = discover;
/** Where the bridge answers a discovery request with its endpoints. */
const discoverReply = (root) => `${root}/discover_r`;
exports.discoverReply = discoverReply;
/** Where the backend publishes the directives for one endpoint. */
const directive = (root, endpointId) => `${root}/${endpointId}/alexaDirective`;
exports.directive = directive;
/**
* What the bridge subscribes to: the discovery requests and the directives of every endpoint. Not <root>/#, which
* also delivers what the bridge itself publishes and the backend's <endpointId>/alexaDirective_e.
*/
const subscriptions = (root) => [(0, exports.discover)(root), (0, exports.directive)(root, "+")];
exports.subscriptions = subscriptions;
/** The endpointId of a directive topic, null for any other topic. */
function directiveEndpoint(root, topic) {
const [, endpointId, ...rest] = topic.startsWith(`${root}/`) ? topic.slice(root.length).split("/") : [];
return endpointId && rest.length === 1 && rest[0] === "alexaDirective" ? endpointId : null;
}
/** Where the answer to a directive goes. "alexaResponce" is how the backend and Alex2ESP spell it. */
const response = (root, endpointId) => `${root}/${endpointId}/alexaResponce`;
exports.response = response;
/** Where the answer goes once a DeferredResponse was sent for the directive. */
const deferred = (root, endpointId) => `${root}/${endpointId}/deferredResponse`;
exports.deferred = deferred;
/** Where every ChangeReport of the root goes: the backend adds the user's token and posts it to Alexa. */
const changeReport = (root) => `${root}/changeReport`;
exports.changeReport = changeReport;