| 214 | |
| 215 | return { |
| 216 | onResponse(requestId, handler) { |
| 217 | // Lowercase here too — resolve() already does; asymmetry means a |
| 218 | // future caller passing a mixed-case ID would silently never match. |
| 219 | // shortRequestId always emits lowercase so this is a noop today, |
| 220 | // but the symmetry makes the contract explicit. |
| 221 | const key = requestId.toLowerCase() |
| 222 | pending.set(key, handler) |
| 223 | return () => { |
| 224 | pending.delete(key) |
| 225 | } |
| 226 | }, |
| 227 | |
| 228 | resolve(requestId, behavior, fromServer) { |
| 229 | const key = requestId.toLowerCase() |