The old bus's wire is pinned unchanged, because this has to merge to a running mesh
Every module's event names were converted from the old bus's routing keys to local names, and this client maps them back. If that mapping is wrong anywhere a live mesh's events stop being delivered — silently, because a binding that matches nothing is not an error. So the mapping is pinned against the literal routing keys the mesh published before, taken from the manifests as they were: what each module now emits, what each now binds, and that a handler still matches what the bus delivers. Including the audit logger's "everything", which must stay `#` on this bus. And a key already in the old form is left alone, so a module built from an older manifest keeps working beside one built from a current manifest — which is the state the mesh will actually be in between deployments.
This commit is contained in:
+4
-4
@@ -373,7 +373,7 @@ function toEnvelope<T>(msg: amqp.ConsumeMessage): Envelope<T> {
|
||||
|
||||
/** AMQP topic matching: `*` matches one word, `#` zero or more. Used to fan a shared queue's
|
||||
* deliveries out to the handlers whose pattern actually matches the routing key. */
|
||||
function topicMatches(pattern: string, key: string): boolean {
|
||||
export function topicMatches(pattern: string, key: string): boolean {
|
||||
return matchFrom(pattern.split("."), 0, key.split("."), 0);
|
||||
}
|
||||
|
||||
@@ -404,19 +404,19 @@ function matchFrom(p: string[], pi: number, k: string[], ki: number): boolean {
|
||||
* **Why it exists at all.** Until 04-ISSUES/127 every module passed the routing key itself, which
|
||||
* worked on this bus and derived into a namespace nobody owns on the one being built. Converting the
|
||||
* modules to local names without this would have broken the mesh that is actually running. */
|
||||
function routingKeyFor(key: string, self: string): string {
|
||||
export function routingKeyFor(key: string, self: string): string {
|
||||
return key.startsWith("module.") ? key : `module.${self}.${key}`;
|
||||
}
|
||||
|
||||
/** A local pattern as this bus's binding. `**` is the mesh's wildcard for the rest of a name; here
|
||||
* that is `#`, and on the bus being built it is `>`. Neither spelling appears in a manifest. */
|
||||
function bindingFor(pattern: string): string {
|
||||
export function bindingFor(pattern: string): string {
|
||||
const here = pattern.split(".").map((part) => (part === "**" ? "#" : part)).join(".");
|
||||
if (here === "#") return "#";
|
||||
return here.startsWith("module.") ? here : `module.${here}`;
|
||||
}
|
||||
|
||||
/** A routing key as the local name a handler and a manifest both use: the emitter and the event. */
|
||||
function localKeyFor(routingKey: string): string {
|
||||
export function localKeyFor(routingKey: string): string {
|
||||
return routingKey.startsWith("module.") ? routingKey.slice("module.".length) : routingKey;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user