diff --git a/lib/session.js b/lib/session.js index b96a5ed..216bf7e 100644 --- a/lib/session.js +++ b/lib/session.js @@ -2552,8 +2552,39 @@ function rpcResponse(sessionContext, id, rpcRes, callback) { } function rpcFault(sessionContext, id, faultResponse, callback) { - // TODO Consider handling invalid parameter faults by automatically refreshing - // relevant data model portions + const rpcReq = sessionContext.rpcRequest; + delete sessionContext.syncState; + delete sessionContext.rpcRequest; + + // Recover from invalid parameter name faults + if (faultResponse.detail.faultCode === "9005") { + const timestamp = sessionContext.timestamp + sessionContext.iteration; + let toClear; + if (rpcReq.name === "GetParameterNames") { + if (rpcReq.parameterPath) { + toClear = [ + [rpcReq.parameterPath.replace(/\.$/, "").split("."), timestamp] + ]; + } + } else if (rpcReq.name === "GetParameterValues") { + toClear = rpcReq.parameterNames.map(p => [ + p.replace(/\.$/, "").split("."), + timestamp + ]); + } else if (rpcReq.name === "SetParameterValues") { + toClear = rpcReq.parameterList.map(p => [ + p[0].replace(/\.$/, "").split("."), + timestamp + ]); + } else if (rpcReq.name === "AddObject") { + toClear = [[rpcReq.objectName.replace(/\.$/, "").split("."), timestamp]]; + } else if (rpcReq.name === "DeleteObject") { + toClear = [[rpcReq.objectName.replace(/\.$/, "").split("."), timestamp]]; + } + + if (toClear) return void clear(sessionContext, toClear, callback); + } + const fault = { code: `cwmp.${faultResponse.detail.faultCode}`, message: faultResponse.detail.faultString, @@ -2561,7 +2592,6 @@ function rpcFault(sessionContext, id, faultResponse, callback) { timestamp: sessionContext.timestamp }; - delete sessionContext.syncState; callback(null, fault); }