fix(client): contain notification-callback failures and document the source lifecycle
Review follow-ups: the three new notify loops (currentProvideInfo subscribers, ui-skill lexicon listeners, late-registration controller setup) now contain per-callback failures so one faulty consumer cannot starve the rest, abort the list projection pass, or poison the source roster with no disposer; controller lexicon polling drops a throwing source with a console record like the candidate path. The ui-slash README (both languages) now states the late-registration warm and the subscribeLexicon contract, and the scenario suite drives a typed /name token gaining its decoration when the roll settles with no further input.
This commit is contained in:
@@ -48,7 +48,16 @@ export function apply(ctx: ClientContext): void {
|
||||
const lexiconListeners = new Map<SessionId, Set<() => void>>()
|
||||
|
||||
const notifyLexicon = (sessionId: SessionId): void => {
|
||||
for (const listener of [...(lexiconListeners.get(sessionId) ?? [])]) listener()
|
||||
for (const listener of [...(lexiconListeners.get(sessionId) ?? [])]) {
|
||||
try {
|
||||
listener()
|
||||
} catch (error) {
|
||||
// Contain listener failures: settlement notifies from an ignored
|
||||
// promise chain (a throw would surface as an unhandled rejection)
|
||||
// and one faulty consumer must not starve the others.
|
||||
console.error('[ui-skill] lexicon listener failed:', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const fetchCatalog = (sessionId: SessionId): Promise<readonly SkillEntry[]> => {
|
||||
|
||||
Reference in New Issue
Block a user