We were suspending the request before we got a chance to kick off the processing for the actual response to be run.
LiftSession is in charge of managing cleanup of non-recently-seen pages and such, so it needs to know about the AjaxRequestInfo list to clean it up when a given request hasn't been needed in sufficiently long.
Before we were relying on the expected length of the funcName, determined by calling nextFuncName. Because funcName isn't *always* the same length, we switch instead ot putting a - between the GUID and the version identifier in the path. We then look for it when extracting the version identifier.
The meat of the deal. Based on the AJAX version appended to the request GUID, we determine whether we've already seen this request. If so, we wait for the original request to complete before returning the resulting value. If we already completed the request before, we return the same answer without re-running the associated parameters. AJAX requests that need to wait are put into continuations if available.
We're about to add some AJAX-related continuation code, so we want it to be clear the existing stuff is for comets.
AJAX requests currently carry a GUID. We now add a single-character version indicator. This version increments for distinct AJAX requests. In particular, it does NOT increment during AJAX retries, so that a retry of an existing request can be identified as being part of the same attempt on the server. Not all AJAX requests carry this version identifier. In particular, Lift GC requests do not carry a version identifier. This is because these are going to be handled in a streamlined handler. If a Lift GC request doesn't make it through, we can retry it as many times as we want and it'll just remark stuff in the session. liftAjax.addPageNameAndVersion appends both the page GUID and the version number. The version number is encoded in base-36.
CometActor had the function by virtue of extending Lift's actor traits; however, the LiftCometActor trait that is often used to reference it didn't define that the method would be present. We add it there so it can be referred to anywhere that LiftCometActor is passed around instead of CometActor. !< returns an LAFuture for a message reply.
…n of jQuery. ** This is more in line with deprecating it, as opposed to just breaking apps.
… add a replacement Artifact for jQuery (which tells Lift how to do comet/ajax and a few other things) ** Added a case object JQueryArtifacts which simply extends the JQueryArtifacts trait. ** Modified the default JsArtifact in LiftRules ro use the new case obejct for jQuery *** Minor spelling fixes.
…s case objects
The default implementation of liftComet.lift_sessionLoss uses LiftRules.noCometSessionPage to do a redirect, while liftAjax's does a page reload (which is what we'd rather have liftComet's do, but we need to be backwards-compatible with noCometSessionPage).
These are the JsCmds that will be sent to the client when a session is missing for a comet or ajax request, respectively. For comets, no comet session is a state where a comet request comes in with no associated session OR with a session that has no associated CometActors (typically this happens on server reload).
The default implementation tries to log the exception and then rethrows it. The log is guarded for the existence of console.error and logged as an error.
CometActor now properly wraps its updates in a try/catch block when cometUpdateExceptionHandler is Full.